home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 176-200 / scopedisk185 / calc / calcvalidate.mod < prev   
Text File  |  1995-03-19  |  3KB  |  166 lines

  1. IMPLEMENTATION MODULE CalcValidate;
  2.  
  3. (*$O- MUST turn off overflow checking! *)
  4. (*$L+*)
  5.  
  6. FROM SYSTEM    IMPORT LONGWORD, BYTE, ADR;
  7. FROM CalcMenus    IMPORT wordSize, signed, WSize;
  8.  
  9.  
  10. CONST
  11.   ZeroDivide = "Divide by Zero!";
  12.   Overflow   = "Overflow Error!";
  13.  
  14.  
  15. PROCEDURE Addition(val1,val2:LONGWORD): BOOLEAN;
  16. VAR
  17.   int1,int2,int3    : LONGINT;
  18.   card1,card2,card3 : LONGCARD;
  19. BEGIN
  20.   errorString:=ADR(Overflow);
  21.  
  22.   IF signed THEN
  23.     int1:=LONGINT(val1);
  24.     int2:=LONGINT(val2);
  25.     int3:=int1+int2;
  26.  
  27.     IF ((int1>0) & (int2<0)) OR ((int1<0) & (int2>0)) THEN
  28.       RETURN TRUE;
  29.     END;
  30.  
  31.     IF (int1>=0) & (int2>=0) THEN
  32.       IF MAX(LONGINT)-int1<int2 THEN
  33.         RETURN FALSE;
  34.       END;
  35.  
  36.       RETURN NOT (((wordSize=WORD16) & (int3>32767)) OR
  37.                   ((wordSize=WORD8) & (int3>127)));
  38.     END;
  39.  
  40.     IF MIN(LONGINT)-int1>int2 THEN
  41.       RETURN FALSE;
  42.     END;
  43.   
  44.     RETURN NOT (((wordSize=WORD16) & (int3<-32768D)) OR
  45.                 ((wordSize=WORD8) & (int3<-128)));
  46.   END;
  47.  
  48.   card1:=LONGCARD(val1);
  49.   card2:=LONGCARD(val2);
  50.   card3:=card1+card2;
  51.  
  52.   IF MAX(LONGCARD)-card1<card2 THEN
  53.     RETURN FALSE;
  54.   END;
  55.  
  56.   RETURN NOT (((wordSize=WORD16) & (card3>65535)) OR
  57.               ((wordSize=WORD8) & (card3>255)));
  58. END Addition;
  59.  
  60.  
  61. PROCEDURE Subtraction(val1,val2:LONGWORD): BOOLEAN;
  62. VAR
  63.   int1,int2,int3    : LONGINT;
  64. BEGIN
  65.   errorString:=ADR(Overflow);
  66.  
  67.   IF signed THEN
  68.     int1:=LONGINT(val1);
  69.     int2:=LONGINT(val2);
  70.     int3:=int1-int2;
  71.  
  72.     IF ((int1>=0) & (int2>=0)) OR ((int1<=0) & (int2<=0)) THEN
  73.       RETURN TRUE;
  74.     END;
  75.  
  76.     IF int2<0 THEN
  77.       IF MAX(LONGINT)+int2<int1 THEN
  78.         RETURN FALSE;
  79.       END;
  80.  
  81.       RETURN NOT (((wordSize=WORD16) & (int3>32767)) OR
  82.                   ((wordSize=WORD8) & (int3>127)));
  83.     END;
  84.  
  85.     RETURN TRUE;
  86.   END;
  87.  
  88.   RETURN LONGCARD(val1)>=LONGCARD(val2);
  89. END Subtraction;
  90.  
  91.  
  92. PROCEDURE Multiplication(val1,val2:LONGWORD): BOOLEAN;
  93. VAR
  94.   int1,int2,int3    : LONGINT;
  95.   card1,card2,card3 : LONGCARD;
  96.   negative : BOOLEAN;
  97. BEGIN
  98.   errorString:=ADR(Overflow);
  99.  
  100.   IF signed THEN
  101.     int1:=LONGINT(val1);
  102.     int2:=LONGINT(val2);
  103.     int3:=int1*int2;
  104.  
  105.     IF ((int1>=-1) & (int1<=1)) OR ((int2>=-1) & (int2<=1)) THEN
  106.       RETURN TRUE;
  107.     END;
  108.  
  109.     negative:=((int1>=0) & (int2<0)) OR ((int1<0) & (int2>=0));
  110.  
  111.     IF negative THEN
  112.       IF ABS(MIN(LONGINT) DIV int1)<ABS(int2) THEN
  113.         RETURN FALSE;
  114.       END;
  115.  
  116.       RETURN NOT (((wordSize=WORD16) & (int3<-32768D)) OR
  117.                   ((wordSize=WORD8) & (int3<-128)));
  118.     END;
  119.  
  120.     IF MAX(LONGINT) DIV ABS(int1)<ABS(int2) THEN
  121.       RETURN FALSE;
  122.     END;
  123.  
  124.     RETURN NOT (((wordSize=WORD16) & (int3>32767)) OR
  125.                 ((wordSize=WORD8) & (int3>127)));
  126.   END;
  127.  
  128.   card1:=LONGCARD(val1);
  129.   card2:=LONGCARD(val2);
  130.   card3:=card1*card2;
  131.  
  132.   IF (card1<=1) OR (card2<=1) THEN
  133.     RETURN TRUE;
  134.   END;
  135.  
  136.   IF MAX(LONGCARD) DIV card1<card2 THEN
  137.     RETURN FALSE;
  138.   END;
  139.  
  140.   RETURN NOT (((wordSize=WORD16) & (card3>65535)) OR
  141.               ((wordSize=WORD8) & (card3>255)));
  142. END Multiplication;
  143.  
  144.  
  145. PROCEDURE Division(val1,val2:LONGWORD): BOOLEAN;
  146. VAR
  147.   int1,int2 : LONGINT;
  148. BEGIN
  149.   errorString:=ADR(Overflow);
  150.   IF signed THEN
  151.     int1:=LONGINT(val1);
  152.     int2:=LONGINT(val2);
  153.     IF (int2=-1) & ( (int1=MAX(LONGINT)) OR ((int1=32767) & (wordSize=WORD16))
  154.                     OR ((wordSize=WORD8) & (int1=127))) THEN
  155.       RETURN FALSE;
  156.     END;
  157.   END;
  158.  
  159.   errorString:=ADR(ZeroDivide);
  160.  
  161.   RETURN (LONGCARD(val2) # 0);
  162. END Division;
  163.  
  164.  
  165. END CalcValidate.
  166.